; task_switch.asm
[bits 32]

section .text

global task_switch
; 函数: task_switch(void* next)
; 参数: next - 指向下一个任务TCB的指针
; 功能: 保存当前任务上下文，切换到下一个任务
task_switch:
    ; 保存调用者的帧指针
    push ebp
    mov ebp, esp
    
    ; 保存被调用者保存的寄存器
    push ebx
    push esi
    push edi
    
    ; 获取当前任务的TCB地址
    ; 假设TCB是页对齐的，取ESP的高12位即可得到TCB地址
    mov eax, esp
    and eax, 0xfffff000    ; 当前TCB地址
    
    ; 保存当前栈指针到当前TCB的esp字段
    mov [eax], esp
    
    ; 加载下一个任务的TCB地址
    mov eax, [ebp + 8]     ; 获取参数next
    
    ; 加载下一个任务的栈指针
    mov esp, [eax]
    
    ; 恢复下一个任务的上下文
    pop edi
    pop esi
    pop ebx
    pop ebp
    
    ; 返回到下一个任务的执行点
    ret
